Appearance
2822. 对象反转
ts
var invertObject = function (obj) {
const result = {}
for (const [key, value] of Object.entries(obj)) {
if (value in result) {
if (Array.isArray(result[value])) {
result[value].push(key) // 直接 push,避免创建新数组
} else {
result[value] = [result[value], key]
}
} else {
result[value] = key
}
}
return result
}值冲突处理
反转对象时,多个 key 可能映射到同一个 value。这个实现的处理方式:
- 第一个 key → value 直接存储为
result[value] = key - 第二个 key 遇到同一个 value → 转为数组
[firstKey, secondKey] - 后续更多 key → push 到数组中
这避免了数据丢失——所有原始 key 都被保留,不会静默覆盖。
注意:value in result 检查的是字符串化后的 value 作为 key 是否存在。因为对象的 key 只能是字符串,value 会被隐式转为字符串。{a: 1} 和 {b: '1'} 在反向后会产生冲突——它们的 value 作为 key 时都是 '1'。
数组判断的位置
Array.isArray(result[value]) 在 push 之前判断,而不是在创建数组时判断。这意味着:
js
invertObject({a: 1, b: 1, c: 1})
// → {1: ['a', 'b', 'c']}每次遇到已存在的 value 时,检查它是否已经是数组。第一次冲突时创建数组 [prev, cur],后续冲突直接 push。如果用新数组覆盖([result[value], key]),会丢失之前的 key。
